package com.gdust.spzx.common.interceptor;

import com.alibaba.fastjson.JSON;
import com.gdust.hzx.model.entity.user.UserInfo;
import com.gdust.hzx.utils.AuthContextUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * ClassName: UserLoginAuthInterceptor
 * Package: com.gdust.spzx.common.interceptor
 * Description:拦截器,拦截前端所有以api开头的接口，只是把当前用户直接放到ThreadLocal中即可，没有别的业务
 *
 * 思路：获取当前用户信息，我们可以加一个拦截器，把当前用户信息放到ThreadLocal中，需要使用时直接从ThreadLocal中获取
 *
 * @Author syun
 * @Create 2024/12/27 10:26
 * @Version 1.0
 */
public class UserLoginAuthInterceptor implements HandlerInterceptor {
    //注入Redis
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 在处理请求之前的拦截方法
     * 通过Token从Redis中获取用户信息，并将其存放到ThreadLocal中
     *
     * @param request  HttpServletRequest，HTTP请求对象
     * @param response HttpServletResponse，HTTP响应对象
     * @param handler  处理器对象
     * @return boolean 返回true表示继续执行后续拦截器或目标方法，返回false则终止
     * @throws Exception 异常信息
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        // 从请求头中获取Token
        String token = request.getHeader("token");
        // 根据Token从Redis中获取用户信息的JSON字符串
        String userJson = redisTemplate.opsForValue().get("user:login:" + token);
        // 将解析后的用户信息放入ThreadLocal
        AuthContextUtil.setUserInfo(JSON.parseObject(userJson, UserInfo.class));
        // 返回true表示继续后续操作
        return true;
    }
}
